package com.basker.pisces.domain.command;

import java.util.HashMap;
import java.util.Map;

import com.basker.pisces.domain.command.meta.Command;
import com.basker.pisces.domain.command.option.CommandExecuteOption;
import com.basker.pisces.domain.entity.meta.Entity;

/**
 * 命令执行上下文，贯穿于整个命令执行的声明周期，每个上下文都是独立的
 *
 * @author hangwen
 */
public class CommandExecuteContext {
    private Entity entity;
    private Command command;
    private CommandExecuteOption option;
    private Map<String, Object> parameters;

    /**
     * 添加参数
     *
     * @param key
     * @param value
     */
    public void addParameter(String key, Object value) {
        if (this.parameters == null) {
            this.parameters = new HashMap<>();
        }

        this.parameters.put(key, value);
    }

    /**
     * 当前执行的命令
     *
     * @return
     */
    public Command getCommand() {
        return command;
    }

    /**
     * 获取命令的来源实体，根据命令的属性，该实体可能是完整实体，也可能是一个子实体。
     *
     * @return
     * @see {@link Command#getRequireFullEntity()}
     * @see {@link Command#getRequiredPropertyAliasList()}
     */
    public Entity getEntity() {
        return entity;
    }

    public CommandExecuteOption getOption() {
        return option;
    }

    /**
     * 获取指定参数
     *
     * @param key
     * @return
     */
    public Object getParameter(String key) {
        return this.parameters != null ? this.parameters.get(key) : null;
    }

    /**
     * 上下文参数，可以用来在一个命令的生命周期内，在各个组件内传递数据
     *
     * @return
     */
    public Map<String, Object> getParameters() {
        return parameters;
    }

    /**
     * 删除指定参数
     *
     * @param key
     */
    public void removeParameter(String key) {
        if (this.parameters != null) {
            this.parameters.remove(key);
        }
    }

    public void setCommand(Command command) {
        this.command = command;
    }

    public void setEntity(Entity entity) {
        this.entity = entity;
    }

    public void setOption(CommandExecuteOption option) {
        this.option = option;
    }

}
